compio_runtime\fd\poll_fd/
mod.rs1cfg_if::cfg_if! {
2 if #[cfg(windows)] {
3 #[path = "windows.rs"]
4 mod sys;
5 } else if #[cfg(unix)] {
6 #[path = "unix.rs"]
7 mod sys;
8 }
9}
10
11#[cfg(windows)]
12use std::os::windows::io::{AsRawSocket, RawSocket};
13use std::{io, ops::Deref};
14
15use compio_buf::IntoInner;
16use compio_driver::{AsFd, AsRawFd, BorrowedFd, RawFd, SharedFd, ToSharedFd};
17
18#[derive(Debug)]
20pub struct PollFd<T: AsFd>(sys::PollFd<T>);
21
22impl<T: AsFd> PollFd<T> {
23 pub fn new(source: T) -> io::Result<Self> {
27 Self::from_shared_fd(SharedFd::new(source))
28 }
29
30 pub fn from_shared_fd(inner: SharedFd<T>) -> io::Result<Self> {
32 Ok(Self(sys::PollFd::new(inner)?))
33 }
34}
35
36impl<T: AsFd + 'static> PollFd<T> {
37 pub async fn accept_ready(&self) -> io::Result<()> {
40 self.0.accept_ready().await
41 }
42
43 pub async fn connect_ready(&self) -> io::Result<()> {
45 self.0.connect_ready().await
46 }
47
48 pub async fn read_ready(&self) -> io::Result<()> {
50 self.0.read_ready().await
51 }
52
53 pub async fn write_ready(&self) -> io::Result<()> {
55 self.0.write_ready().await
56 }
57}
58
59impl<T: AsFd> IntoInner for PollFd<T> {
60 type Inner = SharedFd<T>;
61
62 fn into_inner(self) -> Self::Inner {
63 self.0.into_inner()
64 }
65}
66
67impl<T: AsFd> ToSharedFd<T> for PollFd<T> {
68 fn to_shared_fd(&self) -> SharedFd<T> {
69 self.0.to_shared_fd()
70 }
71}
72
73impl<T: AsFd> AsFd for PollFd<T> {
74 fn as_fd(&self) -> BorrowedFd<'_> {
75 self.0.as_fd()
76 }
77}
78
79impl<T: AsFd> AsRawFd for PollFd<T> {
80 fn as_raw_fd(&self) -> RawFd {
81 self.0.as_raw_fd()
82 }
83}
84
85#[cfg(windows)]
86impl<T: AsFd + AsRawSocket> AsRawSocket for PollFd<T> {
87 fn as_raw_socket(&self) -> RawSocket {
88 self.0.as_raw_socket()
89 }
90}
91
92impl<T: AsFd> Deref for PollFd<T> {
93 type Target = T;
94
95 fn deref(&self) -> &Self::Target {
96 &self.0
97 }
98}